#ifndef ___ASSIT_FUNC_H__
#define ___ASSIT_FUNC_H__

/**
 * @file assit_func.h
 * @author zz (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2024-04-12
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include "stdio.h"
#include "stdlib.h"
#include "stdint.h"


/**
 * @brief 波峰检测
 * 
 * @param x   原始信号
 * @param _size 原始信号大小
 * @param _peak_loc 输出: 波峰的索引
 * @param peak_left  左侧索引: 缓存
 * @param peak_right 右侧索引：缓存 | 输出：缓存:[峰值索引信息]
 * @param res_keep   合格索引：缓存
 * @param distance   参数：最小peak间距
 * @return uint32_t 
 */
uint32_t findpeaks( const int32_t *x,
                    uint16_t _size,
                    uint16_t *_peak_loc,
                    int32_t *peak_left,
                    int32_t *peak_val_shadow,
                    int32_t *peak_right,
                    uint8_t *res_keep,
                    uint32_t distance);



/**
 * @brief 局部最大值，所有的局部最大值
 * 
 * @param x     原始数据
 * @param n     原始数据长度
 * @param temp_midpoints  局部最大值的索引的中点
 * @param temp_left_edges 局部最大值的索引的左边界
 * @param temp_right_edges 局部最大值的索引的右边界
 * @return uint32_t 局部最大值的个数
 */
uint32_t local_maxima_1d(   const int32_t *x, 
                            uint32_t n, 
                            uint16_t *temp_midpoints, 
                            int32_t *temp_left_edges, 
                            int32_t *temp_right_edges);

/**
 * @brief 按照局部最大值和最小peak间距来筛选peak_index
 * 
 * @param _peak_loc 局部最大值的索引所有
 * @param _peak_val 局部最大值的值所有
 * @param _peak_val_arg_cache 缓存，用于保存 argsort 排序后的索引
 * @param _res_keep 结果: 根据输入的值 [局部最大值的索引所有] 确定的合格索引
 * @param _size     输入的参数的长度
 * @param distance  参数： 最小peak间距
 * @return uint32_t 合格的peak个数
 */
uint32_t select_by_peak_distance(uint16_t *_peak_loc ,
                                int32_t *_peak_val,
                                int32_t *_peak_val_shadow,
                                int32_t *_peak_val_arg_cache,
                                uint8_t *_res_keep,
                                uint32_t _size,
                                uint32_t distance);



/**
 * @brief 
 * 
 * @param rawlist   原始数据
 * @param raw_size  原始数据长度 
 * @param detrended_list   去趋势后的数据
 * @param peak_info peak_谷值位置
 * @param peak_size peak_大小
 * @return uint32_t 
 */
uint32_t detrend_move(int32_t *rawlist,uint32_t raw_size,int32_t *detrended_list, int32_t *peak_info, uint32_t peak_size);


void detrend_move_test(void);






#endif

